package org.zlb.algorithm.distance;

import java.util.HashSet;
import java.util.Set;

public class Jaccard {
    
    /**
     * Jaccard系数主要用于计算符号度量或布尔值度量的个体间的相似度，
     * 因为个体的特征属性都是由符号度量或者布尔值标识，因此无法衡量差异具 体值的大小，
     * 只能获得“是否相同”这个结果，
     * 所以Jaccard系数只关心个体间共同具有的特征是否一致这个问题。
     * A和B的交（A ∩ B），以及A和B的并 （A ∪ B）
     * 
     * @return
     */
    public static double r(Set<Character> a, Set<Character> b) {
        Set<Character> set = new HashSet<>();
        set.addAll(a);
        set.addAll(b);
        
        int union = set.size();
        double section = 0.0;
        for (Character ch : set) {
            if (a.contains(ch) && b.contains(ch))
                section ++;
        }
        
        return section/union;
    }

}
